/** 杂项小工具集合 */
import _ from 'lodash';

/**
 * 阻止默认事件并停止冒泡传播
 * @param {object} e DOM事件
 */
export function stop(e) {
    if (typeof e.preventDefault === 'function') {
        e.preventDefault();
    } else { // <IE11
        e.returnValue = false;
    }
    if (typeof e.stopPropagation === 'function') {
        e.stopPropagation();
    }
}

/**
 * 获取指定节点整数类型css属性的值
 * @param nodes DOM节点（或数组）
 * @param props css属性名称（或数组）
 * @returns {Number|number}
 */
export function getIntCss(nodes, props) {
    let total = 0;
    _.each($(nodes), node => {
        total += _.sum(_.map(_.flatten([props]),
            prop => parseInt($(node).css(prop)) || 0));
    });
    return total;
}

/**
 * 获取节点的padding（上下之和）
 * @param node 节点
 * @returns {*}
 */
export function getPadding(node) {
    return getIntCss(node, ['padding-top', 'padding-bottom']);
}

const otherHeights = [
    'margin-top', 'margin-bottom',
    'border-top', 'border-bottom',
    'padding-top', 'padding-bottom'
];

/**
 * 获取节点高度（包括margin,border,padding）
 * @param nodes DOM节点或选择符
 * @param all true - 全部节点，false - 第一个节点
 * @returns {Number}
 */
export function getDOMHeight(nodes, all = true) {
    let height = 0;
    if (all) {
        height = _.sum(_.map($(nodes), node => $(node).height() || 0));
    } else {
        height = $(nodes).height() || 0;
    }
    return getIntCss(nodes, otherHeights) + height;
}

/**
 * 设置节点最大高度
 * @param node 节点
 * @param maxHeight 最大高度
 * @param autoScroll 是否启用滚动条（纵向）
 */
export function setMaxHeight(node, maxHeight, autoScroll = true) {
    $(node).css({
        'max-height': maxHeight,
        'overflow-y': autoScroll ? 'auto' : undefined
    });
}

/**
 * 按类型递归查找父节点
 * @param node 当前节点
 * @param clazz 父节点类型
 * @returns {*|jQuery}
 */
export function findParent(node, clazz) {
    const parent = $(node).parent();
    if (!parent.length) return null;
    if (parent.hasClass(clazz)) {
        return parent;
    }
    return findParent(parent, clazz);
}
